﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms
{
    public partial class frmEmitirFactura : Form
    {
        DisancoEntities context;
        int pedId;
        DataTable dtLineas;
        decimal subtotal;
        decimal iva;
        int autorizacionId;
        long numeroFactura;
        long NroFactura;
        Ventas VentaImprimir;
        decimal descuento;
        decimal subtotal_descontado;
        public static int ventaid;
        bool pendiente;
        int NumeroRemito;
        decimal incrementoventa;

        private Font miniprintFont = new Font("Calibri", 7);
        private Font printFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);
        private Font printFontTit = new Font("Calibri", 12);
        private Font printFontTotal = new Font("Calibri", 13);


        public frmEmitirFactura(int ped_id, decimal incremento)
        {
            InitializeComponent();

            incrementoventa = Convert.ToDecimal(incremento / 100 );

            //STATUS BAR
            string label = (Convert.ToString(incremento) + " % ");
            labelinc.Text = Convert.ToString(label);

                      
            pendiente = false;
            pedId = ped_id;

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == ped_id);
            var cliente = pedido.Clientes;

            int nroLineas = pedido.LineaPedido.Count;

            //Obtener las condiciones de iva disponibles
            cmbTipo.DataSource = Funcion.obtenerTiposFactura(pedido.Clientes.CondicionIVA.condicion_sigla);

            bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());

            if (autorizado)
            {
                //Cargar datos del cliente
                txtbCliNombre.Text = pedido.Clientes.cliente_nombre;
                txtbCliLocalidad.Text = pedido.Clientes.cliente_localidad;
                txtbCliDireccion.Text = pedido.Clientes.cliente_direccion;
                txtbCliCondiva.Text = pedido.Clientes.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = pedido.Clientes.cliente_cuit;

                cargarLineasPedido();

                calcularTotales();
            }
            else
            {
                MessageBox.Show("No se encontraron autorizaciones validas activas");
            }
        }

        public frmEmitirFactura(decimal inc) //para facturar una venta pendiente 
        {
            InitializeComponent();

            //DialogResult dr = MessageBox.Show("¿Facturar esta Venta con un Incremento del 10,5 %", "Confirme la operación", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            //incrementoventa = 0;

            //if (dr == System.Windows.Forms.DialogResult.Yes)
            //{
            //    incrementoventa = 0.105m;
            //}
            incrementoventa = Convert.ToDecimal(inc / 100);

            pendiente = true;
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            Ventas ventapendiente = context.Ventas.FirstOrDefault(vta => vta.id_venta.Equals(ventaid));

            if (ventapendiente != null)
            {

                if (ventapendiente.venta_estado == Clases.Estado.Pendiente)
                {
                    var cliente = ventapendiente.Clientes;
                    int nroLineas = ventapendiente.LineaVenta.Count;

                    //Obtener las condiciones de iva disponibles
                    cmbTipo.DataSource = Funcion.obtenerTiposFactura(ventapendiente.Clientes.CondicionIVA.condicion_sigla);
                    bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());
                    //bool autorizado = buscarAutorizaciones("A");

                    if (autorizado)
                    {
                        //Cargar datos del cliente
                        txtbCliNombre.Text = ventapendiente.Clientes.cliente_nombre;

                        txtbCliLocalidad.Text = ventapendiente.Clientes.cliente_localidad;
                        txtbCliDireccion.Text = ventapendiente.Clientes.cliente_direccion;
                        txtbCliCondiva.Text = ventapendiente.Clientes.CondicionIVA.condicion_sigla;
                        txtbCliCuit.Text = ventapendiente.Clientes.cliente_cuit;

                        cargarLineasPedido();

                        calcularTotales();
                    }
                }
                else
                {
                    MessageBox.Show("Venta Facturada anteriormente!!!", "Información", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    btnEmitir.Enabled = false;
                }
            }
        }

        private int CheckNumber(long number, string type)
        {
            //Verifica si el numero en cuestion ya fue utilizado anteriormente.
            //Los resultados posibles son:
            //0: Ocurrio un error al buscar los numeros
            //1: El numero no fue ocupado aun
            //2: El numero ya fue ocupado

            try
            {
                using (var context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion))
                {
                    var query = context.Ventas.Where(x => x.venta_tipo_comprobante == type).Where(x => x.venta_nro_inicio == number);

                    if (query.Count() > 0)
                        return 2;
                    else
                        return 1;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
                return 0;
            }
        }

        void calcularTotales()
        {
            descuento = numDescuento.Value / 100;
            subtotal_descontado = Funcion.SubtotDescuento(subtotal, descuento);
            
            //antes se hacia asi
            //iva = Math.Round((subtotal_descontado * Constantes.IVA), 2);
            // nuevo
            //iva = Math.Round((subtotal * (Clases.Constantes.IVA)),2);
            ///controlarrrr
            

            iva = Math.Round((subtotal_descontado * (Clases.Constantes.IVA)), 2);
            
            txbIva.Text = iva.ToString("0.00");
            txbSubTotDesc.Text = subtotal_descontado.ToString("0.00");

            string tipo = cmbTipo.SelectedItem.ToString();
            switch (tipo)
            {
                case "A":
                    {
                        txbTotal.Text = (subtotal_descontado + iva).ToString("0.00");
                        txbIva.Enabled = true;
                        break;
                    }
                case "X":
                    {
                        txbTotal.Text = (subtotal_descontado).ToString("0.00");
                        txbSubTotal.Enabled = false;
                        txbIva.Enabled = false;
                        break;
                    }
                case "B":
                    {
                        txbTotal.Text = (subtotal_descontado).ToString("0.00");
                        txbSubTotDesc.Enabled = false;
                        txbSubTotDesc.Text = "";
                        txbIva.Enabled = false;
                        txbIva.Text = " ";
                        txbSubTotal.Text = Convert.ToString(subtotal);
                        break;
                    }
                default:
                    {
                        txbTotal.Text = (subtotal_descontado + iva).ToString("0.00");
                        txbIva.Enabled = true;
                        break;
                    }
            }
        }

        void cargarLineasPedido()
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            decimal preciounitfila;
            decimal preciototfila;
            dtLineas = new DataTable();
            dtLineas.Columns.Add("id");
            dtLineas.Columns.Add("Cantidad");
            dtLineas.Columns.Add("Codigo Art");
            dtLineas.Columns.Add("Articulo");
            dtLineas.Columns.Add("Precio Unitario");
            dtLineas.Columns.Add("Bonif");
            dtLineas.Columns.Add("Precio Bonif");
            dtLineas.Columns.Add("Precio Total");

            subtotal = 0;
            decimal preciosiniva;
            
            if (!pendiente) //para una facturar una VENTA normal
            {
                var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

                foreach (var linea in pedido.LineaPedido)
                {
                    preciounitfila = 0;
                    DataRow fila = dtLineas.NewRow();
                    fila["id"] = linea.art_id;
                    fila["Articulo"] = linea.Articulos.art_nombre;
                    fila["Codigo Art"] = linea.Articulos.art_codigo;
                    fila["Cantidad"] = linea.ped_cant;
                    fila["Bonif"] = linea.ped_oferta_bonif;
                

                    preciosiniva = Math.Round((linea.ped_precio / (1 + Clases.Constantes.IVA)), 2);

                    //decimal preciounitincrementado = Math.Round(preciosiniva + (preciosiniva * incrementoventa), 2);
                    decimal preciounitincrementado = Math.Round(preciosiniva * (1 + incrementoventa), 2);

                    if ((string)cmbTipo.SelectedItem == "B")
                    {
                        decimal precioincrementadodeB = linea.ped_precio * (1 + incrementoventa);
                        //decimal precioincrementadodeB = linea.ped_precio + (linea.ped_precio * incrementoventa);
                        fila["Precio Unitario"] = "$ " + Math.Round(precioincrementadodeB, 2);
                        decimal preciobonif = Math.Round((Funcion.PrecioBonificado(precioincrementadodeB, linea.ped_oferta_bonif)), 2);
                        fila["Precio Bonif"] = "$ " + Math.Round(preciobonif, 2);
                        preciounitfila = Math.Round(preciobonif, 2);
                     }
                    else
                    {

                        fila["Precio Unitario"] = "$ " + preciounitincrementado;
                        fila["Precio Bonif"] = "$ " + Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.ped_oferta_bonif), 2);
                        preciounitfila = Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.ped_oferta_bonif), 2);
                    }
                    fila["Precio Total"] = "$ " + Math.Round((preciounitfila * linea.ped_cant), 2);
                    preciototfila = Math.Round((preciounitfila * linea.ped_cant), 2);
                    dtLineas.Rows.Add(fila);
                    subtotal += Math.Round(preciototfila, 2);
                }
            }
            else //para una facturar una VENTA Pendiente
            {
                var ventapendiente = context.Ventas.FirstOrDefault(v => v.id_venta == ventaid);

                foreach (var linea in ventapendiente.LineaVenta)
                {
                    preciounitfila = 0;
                    DataRow fila = dtLineas.NewRow();
                    fila["id"] = linea.art_id;
                    fila["Articulo"] = linea.Articulos.art_nombre;
                    fila["Codigo Art"] = linea.Articulos.art_codigo;
                    fila["Cantidad"] = linea.cantidad_venta;
                    fila["Bonif"] = linea.oferta_bonif;

                    preciosiniva = Math.Round((linea.precio_venta / (1 + Clases.Constantes.IVA)), 2);
                    decimal preciounitincrementado = Math.Round(preciosiniva * (1 + incrementoventa), 2);
                    //decimal preciounitincrementado = Math.Round(preciosiniva + (preciosiniva * incrementoventa), 2);
                    if ((string)cmbTipo.SelectedItem == "B")
                    {
                        decimal precioincrementadodeB = linea.precio_venta * (1 + incrementoventa);
                        //decimal precioincrementadodeB = linea.precio_venta + (linea.precio_venta * incrementoventa);
                        fila["Precio Unitario"] = "$ " + Math.Round(precioincrementadodeB, 2);
                        decimal preciobonif = Math.Round((Funcion.PrecioBonificado(precioincrementadodeB, linea.oferta_bonif)), 2);
                        fila["Precio Bonif"] = "$ " + Math.Round(precioincrementadodeB, 2);
                        preciounitfila = Math.Round(preciobonif, 2);    
                    }
                    else
                    {
                        fila["Precio Unitario"] = "$ " + preciounitincrementado;
                        fila["Precio Bonif"] = "$ " + Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.oferta_bonif), 2);
                        preciounitfila = Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.oferta_bonif), 2);
                        
                     }
                    fila["Precio Total"] = "$ " + Math.Round((preciounitfila * linea.cantidad_venta), 2);
                    preciototfila = Math.Round((preciounitfila * linea.cantidad_venta), 2);
                    dtLineas.Rows.Add(fila);

                    subtotal += Math.Round(preciototfila, 2);
                }
            }
            subtotal = Math.Round(subtotal, 2);

            txbSubTotal.Text = subtotal.ToString("0.00");

            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        private bool buscarAutorizaciones(string tipo)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            foreach (var auth in context.Autorizaciones)
            {
                if (auth.autorizacion_tipo_comp == tipo &&
                    auth.autorizacion_estado &&
                    auth.autorizacion_limite_fecha.Date > DateTime.Now.Date)
                {
                    autorizacionId = auth.autorizacion_id;
                    numeroFactura = auth.autorizacion_ultimo_numero + 1;

                    if (numeroFactura > auth.autorizacion_limite_max)
                    {
                        MessageBox.Show("No quedan numeros de disponibles para Comprobantes Tipo" + tipo, "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        btnEmitir.Enabled = false;
                        txbFacturaNumero.Enabled = false;
                        return false;
                    }
                    else
                    {
                        txbFacturaNumero.Text = numeroFactura.ToString("000000000000");
                        
                        return true;
                    }
                }

            }

            return false;
        }

        private void cmbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());
            if (autorizado)
            {
                cargarLineasPedido();
                calcularTotales();
            }
            else
            {
                MessageBox.Show("No se encontraron autorizaciones validas activas");
                btnEmitir.Enabled = false;
            }
        }

        private void btnEmitir_Click(object sender, EventArgs e)
        {
            try
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                numeroFactura = Convert.ToInt64(txbFacturaNumero.Text.Replace("-",""));

                if (!pendiente)
                {
                    var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

                    bool valido = true;
                    string lista = "Stock insuficiente para los siguientes articulos:\n";

                    //Verificar existencia de stock
                    foreach (var linea in pedido.LineaPedido)
                    {
                        if (linea.ped_cant > linea.Articulos.art_stock)
                        {
                            valido = false;
                            lista += linea.Articulos.art_nombre + " (" + linea.Articulos.art_stock.ToString() + ")\n";
                        }
                    }

                    if (valido)
                    {
                        //Actualizar stock de cada articulo
                        foreach (var linea in pedido.LineaPedido)
                        {
                            linea.Articulos.art_stock -= linea.ped_cant;
                        }

                        //Registrar ultimo numero de factura usado
                        var auth = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id == autorizacionId);
                        auth.autorizacion_ultimo_numero = Convert.ToInt32(txbFacturaNumero.Text.Replace(" ", "").Replace("-", ""));

                        //Registrar la nueva factura
                        Ventas nuevaVenta = new Ventas();
                        nuevaVenta.cliente_id = pedido.cliente_id;
                        nuevaVenta.venta_fecha = dtpFacturaFecha.Value;
                        nuevaVenta.venta_estado = Estado.SinCae;
                        //nuevaVenta.venta_estado = Estado.Emitida;
                        nuevaVenta.venta_tipo_comprobante = cmbTipo.SelectedItem.ToString();
                        nuevaVenta.venta_nro_inicio = numeroFactura;
                        nuevaVenta.venta_nro_fin = numeroFactura;
                        nuevaVenta.venta_subtotal = subtotal;
                        nuevaVenta.venta_descuento = descuento;

                        if ((string)cmbTipo.SelectedItem == "B")
                            nuevaVenta.venta_iva = 0;
                        else
                            nuevaVenta.venta_iva = iva;

                        foreach (DataRow lineaPedido in dtLineas.Rows)
                        {
                            LineaVenta nuevaLineaVenta = new LineaVenta();
                            nuevaLineaVenta.art_id = Convert.ToInt32(lineaPedido["id"]);
                            nuevaLineaVenta.cantidad_venta = Convert.ToInt32(lineaPedido["Cantidad"]);
                            string preciounit = lineaPedido["Precio Unitario"].ToString().Replace("$", "");
                            nuevaLineaVenta.precio_venta = Convert.ToDecimal(preciounit);
                            string bonif = lineaPedido["Bonif"].ToString().Replace("%", "");
                            nuevaLineaVenta.oferta_bonif = Convert.ToDecimal(bonif);
                            string preciobonif = lineaPedido["Precio Bonif"].ToString().Replace("$", "");
                            nuevaLineaVenta.precio_bonif = Convert.ToDecimal(preciobonif);
                            nuevaVenta.LineaVenta.Add(nuevaLineaVenta);
                        }

                        //Registro una nueva cuenta para esta factura
                        Cuentas nuevaCuenta = new Cuentas();
                        nuevaCuenta.cuenta_fecha = dtpFacturaFecha.Value;

                        if ((string)cmbTipo.SelectedItem == "B")
                            nuevaCuenta.cuenta_monto = subtotal_descontado;
                        else
                            nuevaCuenta.cuenta_monto = subtotal_descontado + iva;

                        nuevaCuenta.cuenta_pagado = 0;
                        nuevaCuenta.cliente_id = pedido.cliente_id;
                        nuevaCuenta.cuenta_estado = Estado.Emitida;
                        nuevaVenta.Cuentas = nuevaCuenta;

                        pedido.ped_estado = Estado.Emitida;

                        context.Ventas.AddObject(nuevaVenta);

                        Pedido pedaeliminar = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);
                        context.Pedido.DeleteObject(pedaeliminar);

                        context.SaveChanges();

                        MessageBox.Show("Factura Generada Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                        //DialogResult dr = MessageBox.Show("¿Desea Imprimir esta factura?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        //if (dr == System.Windows.Forms.DialogResult.Yes)
                        //{
                        VentaImprimir = new Ventas();
                        VentaImprimir = nuevaVenta;
                        imprimir();
                        //this.Close();
                        //}
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show(lista);
                    }

                }
                else // Si es p emitir una venta pendiente de facturar nomas
                {
                    
                    
                    var vtapendiente = context.Ventas.FirstOrDefault(v => v.id_venta == ventaid);

                    RemitoV Remito = context.RemitoV.FirstOrDefault(r => r.id_venta.Equals(vtapendiente.id_venta));
                    if (Remito != null)
                        NumeroRemito = Convert.ToInt32(Remito.remito_nro_inicio);

                    //Registrar ultimo numero de factura usado
                    var auth = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id == autorizacionId);
                    auth.autorizacion_ultimo_numero = Convert.ToInt32(txbFacturaNumero.Text.Replace(" ", "").Replace("-", ""));

                    //Registrar la nueva factura
                    //Ventas nuevaVenta = new Ventas();
                    vtapendiente.venta_fecha = dtpFacturaFecha.Value;
                    vtapendiente.venta_estado = Estado.Emitida;

                    vtapendiente.venta_tipo_comprobante = cmbTipo.SelectedItem.ToString();
                    vtapendiente.venta_nro_inicio = numeroFactura;
                    vtapendiente.venta_nro_fin = numeroFactura;
                    vtapendiente.venta_subtotal = subtotal;
                    vtapendiente.venta_descuento = descuento;

                    if ((string)cmbTipo.SelectedItem == "B")
                        vtapendiente.venta_iva = 0;
                    else
                        vtapendiente.venta_iva = iva;

                    //Actualizo la cuenta de esta factura
                    if (vtapendiente.cuenta_id != null)
                    {
                        int? cuenta_id = vtapendiente.cuenta_id;
                        var cuentapendiente = context.Cuentas.FirstOrDefault(c => c.cuenta_id == cuenta_id);

                        cuentapendiente.cuenta_fecha = DateTime.Now;

                        if ((string)cmbTipo.SelectedItem == "B")
                            cuentapendiente.cuenta_monto = subtotal_descontado;
                        else
                            cuentapendiente.cuenta_monto = subtotal_descontado + iva;

                        cuentapendiente.cuenta_pagado = 0;
                        cuentapendiente.cuenta_estado = Estado.Emitida;
                    }

                    context.SaveChanges();
                    MessageBox.Show("Factura Generada Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    //DialogResult dr = MessageBox.Show("¿Desea Imprimir esta factura?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    //if (dr == System.Windows.Forms.DialogResult.Yes)
                    //{
                    VentaImprimir = new Ventas();
                    VentaImprimir = vtapendiente;
                    imprimir();
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void imprimir()
        {
            NroFactura = numeroFactura;

            pdFacturaUnicaA.PrinterSettings.Copies = 3;
            printDialog.Document = pdFacturaUnicaA;// Si hay q imprimir una sola Factura 
            DialogResult resultadounico = printDialog.ShowDialog();

            if (resultadounico == DialogResult.OK)
            {

                pdFacturaUnicaA.PrinterSettings = printDialog.PrinterSettings;
                printPreviewDialog.Document = pdFacturaUnicaA;
                ((Form)printPreviewDialog).WindowState = FormWindowState.Maximized;
                printPreviewDialog.ShowDialog();

            }

        }

        private void pdFacturaUnicaA_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            string factnumero = NroFactura.ToString();
            string fecha = VentaImprimir.venta_fecha.Date.ToString("dd/MM/yyyy");
            //e.Graphics.DrawLine(Pens.Black, 580, 52, 583, 52);
            e.Graphics.DrawString((factnumero.Substring(1, 8)), miniprintFont, Brushes.Black, 585, 63);
           
            e.Graphics.DrawString("Fecha:", printFontTit, Brushes.Black, 500, 75);
            e.Graphics.DrawString(fecha, printFontTit, Brushes.Black, 570, 75);
            //e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_nombre, printFontNormal10, Brushes.Black, 130, 186);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_direccion, printFontNormal10, Brushes.Black, 130, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_localidad, printFontNormal10, Brushes.Black, 450, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.CondicionIVA.condicion_sigla, printFontNormal10, Brushes.Black, 130, 216);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_cuit, printFontNormal10, Brushes.Black, 450, 216);
            //e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);

            e.Graphics.DrawString("Cliente:", printFontNormal10, Brushes.Black, 90, 186, formato);
            e.Graphics.DrawString("Dirección:", printFontNormal10, Brushes.Black, 80, 201, formato);
            e.Graphics.DrawString("Localidad:", printFontNormal10, Brushes.Black, 400, 201, formato);
            e.Graphics.DrawString("Cond. IVA:", printFontNormal10, Brushes.Black, 80, 216, formato);
            e.Graphics.DrawString("CUIT:", printFontNormal10, Brushes.Black, 415, 216, formato);

            if (pendiente)
            {
                e.Graphics.DrawString("Remito:", printFontNormal10, Brushes.Black, 615, 216, formato);
                e.Graphics.DrawString(Convert.ToString(NumeroRemito.ToString("0000-00000000")), printFontNormal10, Brushes.Black, 665, 216);
            }

            int lineainencabezado = 255;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFontNormal10, Brushes.Black, 24, lineainencabezado);
            String Cod = "Codigo";
            e.Graphics.DrawString(Cod, printFont, Brushes.Black, 83, lineainencabezado + 3);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFontNormal10, Brushes.Black, 315, lineainencabezado);
            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFontNormal10, Brushes.Black, 575, lineainencabezado);
            String Bonif = "Bonif.";
            e.Graphics.DrawString(Bonif, printFontNormal10, Brushes.Black, 635, lineainencabezado);
            String PrecioOf = "Precio Bon";
            e.Graphics.DrawString(PrecioOf, printFontNormal10, Brushes.Black, 675, lineainencabezado);
            String Importe = "Total";
            e.Graphics.DrawString(Importe, printFontNormal10, Brushes.Black, 757, lineainencabezado);

            //Proceso de dibujado de las lineas de factura
            int posY = 275;
            int anchoLinea = 20;
            int posCantidad = margenX + 15;
            int posCod = posCantidad + 42;
            int posArticulo = posCod + 55;
            int posPrecioU = posArticulo + 440;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 51;
            int posPrecioT = posPrecioOf + 62;

            foreach (DataRow fila in dtLineas.Rows)
            {
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFontNormal10, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(fila["Codigo Art"].ToString(), printFont, Brushes.Black, posCod, posY + 3);
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFontNormal10, Brushes.Black, posArticulo, posY);
                e.Graphics.DrawString(fila["Precio Unitario"].ToString(), printFontNormal10, Brushes.Black, posPrecioU, posY);
                decimal bon = (Convert.ToDecimal(fila["Bonif"].ToString()));
                if (bon > 0)
                {
                    string nuevobon = bon.ToString("0.00 %");
                    e.Graphics.DrawString(nuevobon, printFontNormal10, Brushes.Black, posBonif, posY);
                }
                e.Graphics.DrawString(fila["Precio Bonif"].ToString(), printFontNormal10, Brushes.Black, posPrecioOf, posY);
                e.Graphics.DrawString(fila["Precio Total"].ToString(), printFontNormal10, Brushes.Black, posPrecioT, posY);

                posY += anchoLinea;
            }

            int lineafin = 995;
            int lineafinletrachica = 997;
            int posSubtotX = 22;
            decimal total = Math.Round((Convert.ToDecimal(VentaImprimir.venta_monto)), 2);

            // Comentario abajo Factura A y B
            string comentariox = txtbComentarioAB.Text;
            e.Graphics.DrawString(comentariox, printFont, Brushes.Black, posSubtotX + 48 , lineafin - 45);
            
            
            if ((string)cmbTipo.SelectedItem == "A")
            {
                String subtot = "SUB-TOT $";
                e.Graphics.DrawString(subtot, printFontNormal10, Brushes.Black, posSubtotX + 8, lineafinletrachica);
                e.Graphics.DrawString(Convert.ToString(subtotal), printFontNormal10, Brushes.Black, posSubtotX + 81, lineafinletrachica);

                decimal descuento = Math.Round((VentaImprimir.venta_subtotal * VentaImprimir.venta_descuento),2);
                              
                //decimal descuento = Math.Round(Convert.ToDecimal((VentaImprimir.venta_subtotal) - (VentaImprimir.venta_monto - VentaImprimir.venta_iva)), 2);
                String desc = "DESC $";
                e.Graphics.DrawString(desc, printFontNormal10, Brushes.Black, posSubtotX + 160, lineafinletrachica);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 209, lineafinletrachica + 4);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontNormal10, Brushes.Black, posSubtotX + 242, lineafinletrachica);

                String subtotdesc = "SUB-TOT Desc $";
                decimal subtotaldesc = Math.Round(Convert.ToDecimal((VentaImprimir.venta_subtotal) - (descuento)), 2);
                e.Graphics.DrawString(subtotdesc, printFontNormal10, Brushes.Black, posSubtotX + 313, lineafinletrachica);
                e.Graphics.DrawString(Convert.ToString(subtotaldesc), printFontNormal10, Brushes.Black, posSubtotX + 418, lineafinletrachica);
                
                String iva = "IVA $";
                e.Graphics.DrawString(iva, printFontTit, Brushes.Black, posSubtotX + 500, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_iva), printFontTit, Brushes.Black, posSubtotX + 550  , lineafin);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 627, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 702, lineafin);
            }
            else
            {
                String subtot = "SUB-TOTAL $";
                e.Graphics.DrawString(subtot, printFontTit, Brushes.Black, posSubtotX + 178, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_subtotal), printFontTit, Brushes.Black, posSubtotX + 272, lineafin);

                //decimal descuento = Math.Round(Convert.ToDecimal(VentaImprimir.venta_subtotal - VentaImprimir.venta_monto), 2);
                decimal descuento = Math.Round((VentaImprimir.venta_subtotal * VentaImprimir.venta_descuento), 2);
                String desc = "Descuento $";
                e.Graphics.DrawString(desc, printFontTit, Brushes.Black, posSubtotX + 370, lineafin);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontTit, Brushes.Black, posSubtotX + 505, lineafin);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 465, lineafin + 4);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 570, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 650, lineafin);
            }


        }

        private void numDescuento_ValueChanged(object sender, EventArgs e)
        {
            descuento = numDescuento.Value / 100;

            calcularTotales();
        }

        private void txbFacturaNumero_TextChanged(object sender, EventArgs e)
        {
            btnEmitir.Enabled = false;
            txbFacturaNumero.BackColor = SystemColors.Window;
            string textNumber = txbFacturaNumero.Text.Replace(" ", "").Replace("-", "");

            if (textNumber.Length == 12)
            {
                long longNumber = Convert.ToInt64(textNumber);
                string factTipo = cmbTipo.SelectedItem.ToString();
                int statusNumber = CheckNumber(longNumber, factTipo);                

                switch (statusNumber)
                {
                    case 0:
                        txbFacturaNumero.BackColor = Color.Red;
                        break;
                    case 1:
                        txbFacturaNumero.BackColor = Color.LightGreen;
                        btnEmitir.Enabled = true;
                        break;
                    case 2:
                        txbFacturaNumero.BackColor = Color.Red;
                        break;
                }
            }
        }
    }
}
